package com.link.play.fit.ai.utils

import android.annotation.SuppressLint
import android.content.ContentResolver
import android.content.Context
import android.net.Uri
import android.provider.OpenableColumns
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.MultipartBody
import okhttp3.RequestBody.Companion.asRequestBody
import java.io.File
import java.io.FileOutputStream

object FileUtils {
    // 将文件转换为 MultipartBody.Part
    fun fileToPart(file: File): MultipartBody.Part {

        return MultipartBody.Part.createFormData(
            "file",
            file.name,
            file.asRequestBody("image/*".toMediaType())
        )
    }

    fun uriToFile(context: Context, uri: Uri): File? {
        val contentResolver: ContentResolver = context.contentResolver
        val fileName = getFileName(context, uri) ?: "temp_file"
        val tempFile = File(context.cacheDir, fileName)

        return try {
            // 从 Uri 获取输入流
            val inputStream = contentResolver.openInputStream(uri) ?: return null
            // 将流写入临时文件
            inputStream.use { input ->
                FileOutputStream(tempFile).use { output ->
                    input.copyTo(output)
                }
            }
            tempFile
        } catch (e: Exception) {
            e.printStackTrace()
            null
        }
    }

    // 获取文件名（兼容不同来源的 Uri）
    @SuppressLint("Range")
    private fun getFileName(context: Context, uri: Uri): String? {
        val name: String? = when (uri.scheme) {
            ContentResolver.SCHEME_CONTENT -> {
                // 通过 ContentResolver 查询文件名
                val cursor = context.contentResolver.query(uri, null, null, null, null)
                cursor?.use {
                    if (it.moveToFirst()) {
                        it.getString(it.getColumnIndex(OpenableColumns.DISPLAY_NAME))
                    } else {
                        null
                    }
                }
            }
            ContentResolver.SCHEME_FILE -> {
                // 直接提取文件路径中的名称
                uri.lastPathSegment?.substringAfterLast("/")
            }
            else -> null
        }
        return name ?: uri.path?.substringAfterLast("/")
    }

    fun stringUriToFile(context: Context, uriStr: String): File? {
        // 将字符串转换为 Uri 对象
        val uri = Uri.parse(uriStr)

        return when (uri.scheme) {
            // 处理 content:// 类型的 Uri（如相册、文件选择器）
            ContentResolver.SCHEME_CONTENT -> {
                val inputStream = context.contentResolver.openInputStream(uri) ?: return null
                val fileName = getFileNameFromContentUri(context, uri) ?: "temp_${System.currentTimeMillis()}"
                val file = File(context.cacheDir, fileName)

                try {
                    inputStream.use { input ->
                        FileOutputStream(file).use { output ->
                            input.copyTo(output)
                        }
                    }
                    file
                } catch (e: Exception) {
                    e.printStackTrace()
                    null
                }
            }

            // 处理 file:// 类型或直接文件路径
            ContentResolver.SCHEME_FILE, null -> {
                val path = uri.path ?: uriStr // 兼容直接传入路径（如 "/sdcard/..."）
                val file = File(path)
                if (file.exists()) file else null
            }

            // 其他类型（如 http://）不支持直接转换
            else -> null
        }
    }

    /**
     * 从 content:// Uri 中获取文件名
     */
    @SuppressLint("Range")
    private fun getFileNameFromContentUri(context: Context, uri: Uri): String? {
        return context.contentResolver.query(uri, null, null, null, null)?.use { cursor ->
            if (cursor.moveToFirst()) {
                cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME))
            } else {
                null
            }
        }
    }

}